import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
import { TaskService } from '../task/task.service';
import { NotificationService } from './notification.service';

@Injectable()
export class TaskReminderService {
  private readonly logger = new Logger(TaskReminderService.name);

  constructor(
    private readonly taskService: TaskService,
    private readonly notificationService: NotificationService,
  ) {}

  /**
   * 每天早上9点检查即将到期的任务（1天内到期）
   */
  @Cron('0 9 * * *')
  async checkDueDateTasks() {
    this.logger.log('开始检查即将到期的任务...');
    
    const today = new Date();
    const tomorrow = new Date(today);
    tomorrow.setDate(tomorrow.getDate() + 1);
    
    // 查找截止日期在今天和明天之间的未完成任务
    const tasks = await this.taskService.findTasksByDueDate(today, tomorrow);
    this.logger.log(`找到 ${tasks.length} 个即将到期的任务`);
    
    // 为这些任务发送提醒通知
    for (const task of tasks) {
      await this.notificationService.sendTaskDueDateNotification(task.id);
    }
    
    this.logger.log('任务截止日期检查完成');
  }

  /**
   * 每周一早上9点检查本周到期的任务
   */
  @Cron('0 9 * * 1')
  async checkWeeklyDueDateTasks() {
    this.logger.log('开始检查本周到期的任务...');
    
    const today = new Date();
    const endOfWeek = new Date(today);
    endOfWeek.setDate(today.getDate() + (7 - today.getDay()));
    
    // 查找截止日期在本周的未完成任务
    const tasks = await this.taskService.findTasksByDueDate(today, endOfWeek);
    this.logger.log(`找到 ${tasks.length} 个本周到期的任务`);
    
    // 为任务创建者和负责人发送每周摘要
    const userTasksMap = new Map();
    
    for (const task of tasks) {
      // 收集每个用户的任务
      if (task.assigneeId) {
        if (!userTasksMap.has(task.assigneeId)) {
          userTasksMap.set(task.assigneeId, []);
        }
        userTasksMap.get(task.assigneeId).push(task);
      }
      
      // 如果创建者不是负责人，也为创建者收集任务
      if (task.createdById && task.createdById !== task.assigneeId) {
        if (!userTasksMap.has(task.createdById)) {
          userTasksMap.set(task.createdById, []);
        }
        userTasksMap.get(task.createdById).push(task);
      }
    }
    
    // 发送每周任务摘要通知
    // 注：这里需要实现一个新的通知类型和方法，暂时先记录日志
    this.logger.log(`需要发送周任务摘要给 ${userTasksMap.size} 个用户`);
    
    this.logger.log('本周任务检查完成');
  }
} 